package io.github.wangtisnruipopo.carscore.types;

import java.util.List;

/**
 * <h1>玩家接口</h1>
 *
 * @param <C> 对应的卡牌类型
 * @author wangtianrui
 */
public interface IPlayer<
        D extends AbsDecorValue,
        V extends AbsCardValue,
        C extends ISimpleCard<D, V>>
        extends INotifyPlay {
    /**
     * <h2>获取玩家id</h2>
     *
     * @return 玩家id
     */
    String getId();

    /**
     * <h2>获取玩家姓名</h2>
     *
     * @return 玩家姓名
     */
    String getName();

//    void setGame(IGame<?> game);

    /**
     * <h2>获取玩家手中的牌</h2>
     *
     * @return 玩家手中的牌的集合
     */
    List<C> getCards();

    /**
     * <h2>给玩家添加一张卡牌</h2>
     *
     * @param card 卡牌
     */
    void push(C card);

    /**
     * <h2>是否是AI托管</h2>
     *
     * @return 是返回true，否返回false
     */
    boolean isComputer();

    /**
     * <h2>玩家是否存活</h2>
     *
     * @return 是返回true，否返回false
     */
    boolean isAlive();

    /**
     * <h2>是否可以接收游戏管理者向玩家发牌</h2>
     *
     * @return 可以返回true，不可以返回false
     */
    boolean isDeal();

    void setGame(IGame<D,
            V,
            C,
            ? extends ISuitCards<D, V, C>,
            ? extends IPlayer<D, V, C>,
            ? extends IPlayCardsRecord<D, V, ? extends IPlayCardsType<C>, C, ? extends IPlayer<D, V, C>>,
            ?> game);

    /**
     * <h2>出牌结束的回调函数</h2>
     */
    void setPlayEnd(IPlayEnd playEnd);

    /**
     * <h2>出牌逻辑</h2>
     *
     * @param playCards 本次出的牌
     */
    IPlayCardsRecord<?, ?, ?, ?, ?> play(List<C> playCards);
}
